package common

import (
	"github.com/eywa-protocol/bls-crypto/bls"
	"sync"
)

type Channel struct {
	// 互斥锁
	sync.Mutex

	// 基本信息
	// Type int
	Cid int // 通道编号
	Adv bls.PublicKey // 通道对方是睡
	AdvIP string // 对手的IP
	Version int // 当前的通道状态版本号
	Type int // 0-自己创建的，自己是A; 1-对方创建的，对方是A

	// 通道状态
	MyChPub bls.PublicKey
	MyChPri bls.PrivateKey
	AdvChPub bls.PublicKey
	MyBalance int
	AdvBalance int
	LifeTime int

	// 通道创建
	// 初始化阶段
	InputCreateUTXOA UTXO // 主动一方的UTXO
	InputCreateUTXOB UTXO // 被动一方的UTXO
	ChannelPub bls.PublicKey // 通道的账户 Type=0 MyChPub.aggregate(AdvChPub), Type=1 AdvChPub.aggregate(MyChPub)
	CreateUTXO UTXO // 最终的通道UTXO
	TxCreate Transaction // 最终的通道创建交易

	// 通知阶段
	MyNotifyPub bls.PublicKey
	MyNotifyPri bls.PrivateKey
	NotifyUTXOA UTXO
	NotifyUTXOB UTXO

	// 通道更新
	AdvLockPubs []bls.PublicKey // 用于对方锁定账户的公钥，错误
	AdvLockPris []bls.PrivateKey // 用于对方锁定账户的私钥，错误
	MyLockPubs []bls.PublicKey
	MyLockPris []bls.PrivateKey
	TxCommits []Transaction
	TxRefunds []Transaction
	TxUnlocks []Transaction
	TxPunishs []Transaction

	AdvTxCommits []Transaction //暂存为对方构建的commit交易，减少网络开销

	// 通道关闭阶段
	TxClose Transaction
}

func (ch Channel)Show()  {
	ch.Lock()

	println("cid = ", ch.Cid)
	println("adv = ", ch.Adv.Marshal())
	println("<< utxo a >>")
	ch.InputCreateUTXOA.Show()
	println("<< utxo b >>")
	ch.InputCreateUTXOB.Show()

	ch.Unlock()
}